package com.tungse.volatile_test;

import java.util.concurrent.Callable;

/**
 * @author Tungse
 * 在多线程环境下，每个线程都有自己的工作内存，线程在操作变量时，
 * 会先将主内存中的变量副本读取到自己的工作内存中，对副本进行操作后，再将结果写回主内存。
 * 如果一个变量被声明为 volatile，当一个线程修改了这个变量的值，会立即将修改后的值刷新到主内存中，
 * 同时其他线程在使用这个变量时，会强制从主内存中读取最新的值，而不是使用自己工作内存中的旧值，从而保证了变量在不同线程之间的可见性。
 */
public class Volatile_Test {

    public static void main(String[] args) throws InterruptedException {
        Aobing aobing = new Aobing();
        aobing.start();

        for ( ;  ; ) {
            synchronized(aobing) {
                if (aobing.isFlag()) {
                    System.out.println("输出测试!");
                    //break;
                }
            }
        }
    }

}

class  Aobing extends Thread {
//    private volatile Boolean flag = false;
    private Boolean flag = false;
    public Boolean isFlag() {
        return flag;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        flag = true;
        System.out.println("flag = " + flag);
    }
}

